package com.example.demo.pattern.single;

/**
 * 懒汉单例模式
 *
 * @author wangadmin
 */
public class SingleByLazyMan {


    // volatile 防止指令重排导致的空指针
    private static volatile SingleByLazyMan singleByLazyManObj;

    public static SingleByLazyMan getSingleInstance() {

        if (singleByLazyManObj == null) {
            synchronized (SingleByLazyMan.class) {
                // 双检法 多线程下请求同时进入了上面的 singleByLazyManObj == null
                // 会有一个请求进入下面的请求其余的线程会进行aqs重试
                // 如果不再检查一次还是会造成资源重复创建
                if (singleByLazyManObj == null) {
                    // new SingleByLazyMan 不是原子操作可能由于jvm指令重排导致异常 需对操作对象进行volatile描述进行指令重排
                    singleByLazyManObj = new SingleByLazyMan();
                }
            }
        }
        return singleByLazyManObj;
    }


}
